sockets

您所在的位置:网站首页 netty channel inactive sockets

sockets

2024-07-14 20:26| 来源: 网络整理| 查看: 265

我正在使用 netty 4.x,我终于找到它调用

public boolean isActive() { SocketChannel ch = javaChannel(); return ch.isOpen() && ch.isConnected(); }

我可以用它来检查客户端和服务器之间的连接是否可读/可写吗?

如果答案是肯定的,那么我相信isActive use sth。像心跳一样检查客户端的状态。但是当我抓取 tcp 数据包时,我找不到任何数据包通过 wireshark 过滤器 tcp.port==12093(这是我的服务器端口)作为心跳工作。

任何建议都是有帮助的。

最佳答案

Channel.isActive() 通过查找查询底层套接字以查看它是否已连接来工作。

所以如果我们想知道它是如何工作的,我们应该更深入地挖掘,如果你使用带有 tcp 连接的 netty,你几乎可以肯定你使用的是 java nio sockets .

来自 io.netty.channel.socket.nio.NioSocketChannel:

@Override public boolean isActive() { SocketChannel ch = javaChannel(); return ch.isOpen() && ch.isConnected(); }

上述两种方法都没有那么有趣,它们只是由 native 代码设置为正确值的 bool 标志。

但是,由于 isActive() 只返回那些 bool 标志,您无法确定在您调用该函数时连接是否仍在工作,最好的方法是更改​​您的协议(protocol)以包含某种 ping 消息,例如 IRC 有一个 ping 命令,或者 FTP 有 NOOB 命令。

发送 ping 信息时,一定要留有足够的余量以防部分网络丢包,比如你的电脑是通过 WIFI 连接的,就会有一些丢包。但是,操作系统中的 native tcp 层应该为您处理这些数据包丢失并重新发送,但这可能意味着在您发送 ping 消息后,可能需要整整一分钟 isActive() 才会返回 false。

如果您想在协议(protocol)中添加自动 ping 消息,查看 IdleStateHandler 可能是明智的选择和 WriteTimeoutHandler .

关于sockets - Channel.isActive() 如何在 netty 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637911/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3